package com.blackhorse.demo.myBeanFactory;

import com.blackhorse.demo.myBeanFactory.dao.MyAccountDao;
import com.blackhorse.demo.myBeanFactory.factory.MyBeanFactory;
import com.blackhorse.demo.myBeanFactory.service.MyAccountService;
import com.blackhorse.demo.myBeanFactory.service.MyAccountServiceImpl;

/**
 * 创建一个表现层，模拟调用业务逻辑层（间接调用持久层）
 * <p>
 * 单例对象和多例对象的区别：
 * 单例对象：只有第一次获取需要初始化，在内存中只存在一个，效率高，但线程不安全（成员变量可能会被多个线程访问）。
 * 多例对象：每次获取都会初始化，在内存中存在多个，效率低，但线程安全（每个对象都有各自的成员变量）。
 * <p>
 * 注意：service层对象和dao层对象一般不需要操作成员变量，不需要考虑线程安全问题，因此常用单例模式提高效率。
 */
public class Cilent {
    public static void main(String[] args) {
        //0.之前的写法，直接new
        MyAccountService service = new MyAccountServiceImpl();
        service.saveAccount();

        System.out.println("-------------------------------------");
        //1.工厂模式的写法，通过id获得对象
        for (int i = 0; i < 5; i++) {
            MyAccountService acountService = MyBeanFactory.getBean("accountService", MyAccountService.class);
            acountService.saveAccount();
            System.out.println("第" + i + "个对象的hashcode：" + acountService.hashCode());
        }

        //2.工厂模式的写法，通过id获得对象
        MyAccountDao accountDao = MyBeanFactory.getBean("accountDao", MyAccountDao.class);
        accountDao.saveAccount();
    }
}
